package main

import (
	"fmt"
	"strings"
)

// 闭包指的是：闭包= 函数 + 引用环境
// (1)闭包实例1，返回一个函数
func wsd() func(int) int {
	var x int
	return func(y int) int {
		x += y
		return x
	}
}

// (2)闭包实例2
func makeS(suffix string) func(string) string {
	return func(name string) string {
		////判断字符串name是否以suffix字符串结尾
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}
		return name
	}
}

// (3)闭包实例3
func calca(base int) (func(int) int, func(int) int) {
	add := func(i int) int {
		base += i
		return base
	}
	sub := func(i int) int {
		base -= i
		return base
	}
	return add, sub
}

func main() {
	//(1)变量f是一个函数并且它引用了其外部作用域中的x变量，此时f就是一个闭包，在f的生命周期内，变量x一直有效
	var f = wsd()
	fmt.Println(f(10)) //10

	//(2)
	jpg := makeS("./jpg")
	fmt.Println(jpg("test"))

	//(3)
	f1, f2 := calca(10)
	fmt.Println(f1(11), f2(12))
}
